/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package ar.uba.fi.posgrado.economy.service;

import java.util.List;

import org.springframework.transaction.annotation.Propagation;

import ar.uba.fi.posgrado.common.exception.PosgradoException;
import ar.uba.fi.posgrado.common.exception.PosgradoRuntimeException;
import ar.uba.fi.posgrado.common.model.User;
import ar.uba.fi.posgrado.common.service.GenericService;
import ar.uba.fi.posgrado.economy.model.Benefit;
import ar.uba.fi.posgrado.economy.model.BenefitStatus;

/**
 * Servicio de {@link Benefit}
 * 
 * @author nicolas.gonzalez
 * @see GenericService
 */
public interface BenefitService extends GenericService<Benefit> {
    
    /**
     * Busca los beneficios de acuerdo a:
     * <ul>
     *  <li>Status</li>
     *  <li>Student</li>
     * </ul>
     * <br>
     * Si alguno es nulo entonces no lo tiene en cuenta
     * 
     * @param status
     * @return
     * @throws PosgradoRuntimeException
     * @throws PosgradoException
     */
    public List<Benefit> getBenefitsByStatus(BenefitStatus status) throws PosgradoRuntimeException,  PosgradoException;

    /**
     * Busca los beneficios a partir de sus Ids.<br>
     * @param benefitIds
     * @return
     * @throws PosgradoRuntimeException
     * @throws PosgradoException
     */
    public List<Benefit> getBenegitsByIds(List<Long> benefitIds) throws PosgradoRuntimeException,  PosgradoException;
 
	/**
	 * Ejecuta los jobs de {@link #activateBenefits()} y {@link #deActivateBenefits()} en
	 * forma online.<br><br>
	 * 
	 * En caso de que el usuario no sea administrador, devuelve una exception.<br>
	 * 
	 * @param user Usuario del cual se espera q sea administrador.<br>
	 * @throws PosgradoException
	 */
	public void executeOnlineJobs(User user) throws PosgradoException;

    
    /**
     * Activa los {@link Benefit beneficios} q se tienen a activar
     * de acuerdo a la fecha.<br>
     * La transaccionabilidad es {@link Propagation#MANDATORY mandatory}, lo q
     * significa q en caso de no existir una transaccion arrastrada falle el
     * servicio.<br>
     * 
     * @return Devuelve los beneficios activados.<br>
     * @throws PosgradoException
     */
    public List<Benefit> activateBenefits() throws PosgradoException;
    
    /**
     * Desactiva los {@link Benefit beneficios} q se tienen a desactivar
     * de acuerdo a la fecha.<br>
     * La transaccionabilidad es {@link Propagation#MANDATORY mandatory}, lo q
     * significa q en caso de no existir una transaccion arrastrada falle el
     * servicio.<br>
     * 
     * @return Devuelve los beneficios desactivados.<br>
     * @throws PosgradoException
     */
    public List<Benefit> deActivateBenefits() throws PosgradoException;
    
}
